package org.example;// H2ServerMode.java

import java.sql.*;

public class H2ServerMode {

    // 内存数据库名称（通过 TCP 访问时使用）
    private static final String DB_NAME = "mydb";

    // TCP 模式 URL（允许远程连接）
    private static final String TCP_URL = "jdbc:h2:tcp://localhost/mem:" + DB_NAME;

    // 内嵌模式用于本地初始化（必须用 tcp:// 访问同一数据库）
    private static final String EMBEDDED_URL = "jdbc:h2:mem:" + DB_NAME + ";DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE";

    private static final String USER = "sa";
    private static final String PASSWORD = "";

    public static void main(String[] args) {
        try {
            // 1. 加载 H2 驱动
            Class.forName("org.h2.Driver");

            // 2. 启动 H2 TCP 服务器（允许多客户端连接）
            org.h2.tools.Server server = org.h2.tools.Server.createTcpServer(
                    "-tcp",           // 启用 TCP 服务
                    "-tcpAllowOthers", // 允许外部主机连接（可选）
                    "-tcpPort", "9092", // 端口，默认 9092
                    "-ifNotExists"     // 不覆盖已有数据库
            ).start();

            System.out.println("🚀 H2 TCP Server 已启动: tcp://localhost:9092");
            System.out.println("🔗 外部连接 URL: jdbc:h2:tcp://localhost:9092/mem:" + DB_NAME);

            // 3. 通过嵌入式连接初始化数据库（建表 + 插数）
            initializeDatabase();

            // 4. 启动 H2 Web 控制台（可选）
            startWebConsole();

            // 5. 阻塞主线程，防止 JVM 退出
            System.out.println("⏳ H2 内存数据库正在运行... 按 Ctrl+C 退出。");
            Thread.currentThread().join(); // 永久阻塞，直到被中断

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 初始化数据库：建表 + 插入数据
     */
    private static void initializeDatabase() throws SQLException {
        try (Connection conn = DriverManager.getConnection(EMBEDDED_URL, USER, PASSWORD)) {
            System.out.println("🔧 正在初始化数据库...");

            // 创建表
            try (Statement stmt = conn.createStatement()) {
                stmt.execute("                    CREATE TABLE IF NOT EXISTS users ("
                        + "id BIGINT AUTO_INCREMENT PRIMARY KEY,"
                        + "name VARCHAR(100) NOT NULL,"
                        + "email VARCHAR(100) UNIQUE NOT NULL,"
                        + "created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP) ");
                System.out.println("✅ 表 'users' 创建成功");
            }

            // 插入初始数据
            String insertSql = "INSERT INTO users(name, email) VALUES (?, ?)";
            try (PreparedStatement pstmt = conn.prepareStatement(insertSql)) {
                String[][] sampleData = {
                        {"Alice", "alice@example.com"},
                        {"Bob", "bob@example.com"},
                        {"Charlie", "charlie@example.com"}
                };

                for (String[] user : sampleData) {
                    pstmt.setString(1, user[0]);
                    pstmt.setString(2, user[1]);
                    int rows = pstmt.executeUpdate();
                    if (rows > 0) {
                        System.out.println("✅ 插入用户: " + user[0]);
                    }
                }
            }

            // 验证数据
            try (Statement stmt = conn.createStatement();
                 ResultSet rs = stmt.executeQuery("SELECT COUNT(*) AS total FROM users")) {
                if (rs.next()) {
                    System.out.println("📊 共初始化 " + rs.getLong("total") + " 条用户数据");
                }
            }
        }
    }

    /**
     * （可选）启动 H2 Web 控制台
     */
    private static void startWebConsole() {
        try {
            org.h2.tools.Server webServer = org.h2.tools.Server.createWebServer(
                    "-web",
                    "-webAllowOthers",
                    "-webPort", "8082"
            ).start();
            System.out.println("🌐 H2 Web 控制台已启动: http://localhost:8082");
            System.out.println("👉 登录时使用 JDBC URL: " + TCP_URL);
            System.out.println("👉 用户名: sa, 密码: 留空");
        } catch (SQLException e) {
            System.err.println("⚠️ 无法启动 H2 Web 控制台: " + e.getMessage());
        }
    }
}